<?php
    //声明编码
    header("Content-Type:text/html;charset=utf-8");


    //单条查询
    function find($sql = null)
    {
        //引入全局变量
        global $conn;
        $res = mysqli_query($conn, $sql);
        if(!$res)
        {
            echo "SQL语句执行失败：".$sql;
            exit;
        }

        //返回数据
        return mysqli_fetch_assoc($res);
    }

    //多条查询
    function all($sql = null)
    {
        //引入全局变量
        global $conn;
        $res = mysqli_query($conn, $sql);
        if(!$res)
        {
            echo "SQL语句执行失败：".$sql;
            exit;
        }

        // 多条数据就是要循环
        $list = [];

        while($data = mysqli_fetch_assoc($res))
        {
            $list[] = $data;
        }

        //返回数据
        return $list;
    }


    // 插入函数
    function add($table, $data)
    {
        // INSERT INTO 表名(`字段1`,`字段2`,`字段3`)VALUES('值1','值2','值3')
        global $conn;
        global $pre_;

        //给表名拼接上表前缀
        $table = $pre_.$table;

        //将数组里面的索引全部提取出来变成一个新数组
        $keys = array_keys($data);

        //数组变成字符串
        $fields = "`".implode("`,`", $keys)."`";

        $values = "'".implode("','", $data)."'";

        $sql = "INSERT INTO $table($fields)VALUES($values)";

        //执行语句
        $res = mysqli_query($conn, $sql);

        if(!$res)
        {
            echo "SQL语句执行失败：".$sql;
            exit;
        }

        //返回插入ID
        return mysqli_insert_id($conn);
    }

    //更新
    function update($table, $data, $where = 1)
    {
        //UPDATE 表名 SET `字段1` = '值1', `字段2` = '值2' WHERE 条件
        global $conn;
        global $pre_;

        //拼接表名
        $table = $pre_.$table;

        //直接组装
        $str = "";

        foreach($data as $key=>$item)
        {
            $str .= "`$key` = '$item',";
        }

        $str = trim($str, ",");

        //组装sql语句
        $sql = "UPDATE $table SET $str WHERE $where";

        //执行sql
        $res = mysqli_query($conn, $sql);

        if(!$res)
        {
            echo "SQL语句执行失败：".$sql;
            exit;
        }

        //返回影响行数
        return mysqli_affected_rows($conn);
    }


    //删除
    function del($table, $where = 1)
    {
        //DELETE FROM 表名 WHERE where
        global $conn;
        global $pre_;

        $table = $pre_.$table;

        $sql = "DELETE FROM $table WHERE $where";

        //执行sql
        $res = mysqli_query($conn, $sql);

        if(!$res)
        {
            echo "SQL语句执行失败：".$sql;
            exit;
        }

        //返回影响行数
        return mysqli_affected_rows($conn);
    }


    /**
     * 提醒消息的方法
     * @msg 提醒消息内容
     * @url 跳转的地址
     */
    function ShowMsg($msg = '', $url = '') {

        $msg = empty($msg) ? '未知消息' : trim($msg);

        @header("Content-Type:text/html;charset=utf-8");

        //输出的内容
        $out = '';

        if(empty($url)){
            $out =  "
            <script>
                alert('$msg');
                history.go(-1);
            </script>
        ";
        } else{
            //地址不为空，就跳转到指定的界面
            $out = "
                <script>
                    alert('$msg');
                    location.href = '$url';
                </script>
            ";
        }

        echo $out;
        return;
    }

    /* 
    *   获取当前的网址   
    */
    function get_url() {
        // $_SERVER['PHP_SELF']: 包含当前(例如包含)文件的完整路径和文件名
        $str = $_SERVER['PHP_SELF'] .'?';
        if ($_GET){
            foreach($_GET as $k=>$v){
                if($k !='page'){
                    $str.= $k.'='.$v.'&';
                }
            }
        }

        return $str;
    }

    /** 
     * 
     * 分页函数
     * @pargam $current 当前页
     * @pargam $count   记录总数
     * @pargam $limit   每页显示多少条
     * @pargam $size    中间显示多少条
     * @pargam $class   样式
     * 
    */

    function page($current,$count,$limit,$size,$class='digg'){
        $str = '';
        if($count > $limit){
            // 算出总页数
            $pages = ceil($count / $limit);
            // 获取当前页面的url（带有参数的）
            $url = get_url();
            // 开始拼接分页
            $str.='<div class="'.$class.'">';

            // 判断当前页是否是1
            if($current == 1){
                $str.='<span class="disabled">首&nbsp;&nbsp;页</span>';
                $str.='<span class="disabled">上一页</span>';
            } else{
                $str.='<a href="'.$url.'page=1">首&nbsp;&nbsp;页</a>';
                $str.='<a href="'.$url.'page='.($current - 1).'">上一页</a>';
            }

            // 中间
            if($current<=floor($size / 2)){
                $start = 1;
                $end = $pages < $size ? $pages : $size;
            }elseif ($current >= $pages - floor($size / 2)) {
                $start = $pages - $size + 1 <= 0 ? 1 : $pages - $size + 1;
                $end = $pages;
            }else {
                $start = $current - floor($size / 2);
                $end = $current + floor($size / 2);
            }

            for($i=$start;$i<=$end;$i++){
                if($i==$current){
                    $str.='<span class="current">'.$i.'</span>';
                }else{
                    $str.='<a href="'.$url.'page='.$i.'">'.$i.'</a>';
                }
            }

            //最后
            if($pages==$current){
                $str .='<span class="disabled">下一页</span>';
                $str.='<span class="disabled">尾&nbsp;&nbsp;页  </span>';
            }else{
                $str.='<a href="'.$url.'page='.($current+1).'">下一页</a>';
                $str.='<a href="'.$url.'page='.$pages.'">尾&nbsp;&nbsp;页 </a>';
            }

            $str.='</div>';
        }
        return $str;
    }

    /**
     * 文件上传函数
     * $name input的名字
     * $type 上传的文件类型
     * $size 限制的文件大小
     * $path 文件上传存放的路径
     */
    function upload($name='image',$path = './uploads',$type=['jpg', 'png', 'gif'], $size=12345678){
        
        //返回的上传信息
        $result = [
            'success'=>false, //是否上传成功
            'msg'=>'',  //上传成功或者失败的信息
        ];

        $input = $_FILES[$name];

        //说明图片上传报错
        if($input['error'] > 0)
        {
            $result['success'] = false;
            $result['msg'] = '文件上传失败(错误码):'.$input['error'];
            return $result;
        }

        //判断文件上传的类型对不对  pathinfo() 函数以数组的形式返回关于文件路径的信息。PATHINFO_EXTENSION: 文件后缀名  
        $ext = pathinfo($input['name'],PATHINFO_EXTENSION);

        //判断文件类型
        if(!in_array($ext, $type))
        {
            $result['success'] = false;
            $result['msg'] = '上传文件的格式错误';

            return $result;
        }
    
        //判断大小不能超过指定限制的大小
        if($input['size'] > $size)
        {
            $result['success'] = false;
            $result['msg'] = '上传文件已超过最大限制';

            return $result;
        }

         //先要判断一下文件存放的目录是否存在
        if(!is_dir($path))
        {
            $result['success'] = false;
            $result['msg'] = '文件上传存放的目录不存在';

            return $result;
        }

         //原文件名
        $filename = pathinfo($input['name'], PATHINFO_FILENAME);

        //新文件名 rtrim返回不带后空格 返回不带前导空格 (LTrim)、后续空格 (RTrim) 或前导与后续空格 (Trim) 的字符串副本。
        $path = rtrim($path, "/");

        $newname = $path."/".$filename.time().".".$ext;

        //判断是否通过http post上传的
        if(!is_uploaded_file($input['tmp_name']))
        {
            $result['success'] = false;
            $result['msg'] = '文件上传途径有误';
            return $result;
        }
    
        //move_uploaded_file最后的步骤将临时文件移动到指定的目录里面
        if(move_uploaded_file($input['tmp_name'], $newname))
        {
            $result['success'] = true;
            $result['msg'] = $newname;
            return $result;
        }else
        {
            $result['success'] = false;
            $result['msg'] = '文件上传失败';
            return $result;
        }
    }






    //当函数不存在的时候才去创建  function_exists:判断函数是否定义,生成密码盐
    if(!function_exists('randstr')){
        /**
         * 获得随机字符串
         * @param $len            需要的长度
         * @param $special        是否需要特殊符号
         * @return string         返回随机字符串
         */
        function randstr($len= 8, $special = false){
            $chars = array(
                "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
                "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
                "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
                "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
                "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
                "3", "4", "5", "6", "7", "8", "9"
            );

            if($special){
                // array_merge — 合并一个或多个数组
                $chars = array_merge($chars,array(
                    "!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
                    "%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
                    "}", "<", ">", "~", "+", "=", ",", "."
                ));
            }

            //count: 数组的长度
            $charsLen = count($chars) - 1;

            //打乱数组顺序
            shuffle($chars);
            //随机取出一位 选八个  mt_rand:返回随机整数
            $str = '';
            for($i = 0; $i<$len; $i++){
                $str .= $chars[mt_rand(0, $charsLen)];   
            }
            return $str;
        }
    }
  